# 习题解答2.1 ndarray 快速入门 这里是2.1节的习题。我们先在这里`import`所有需要用到的库。 ```python import numpy as np import pandas as pd arr1 = np.load("data/1-task-arr1.npy") arr2 = np.load("data/1-task-arr2.npy") iris_df = pd.read_csv("data/iris.csv") ``` ## 基础练习 1. 请创建形状为`(3, 4, 5)`的全0,全1,全2 数组. ```python shape = (3, 4, 5) arr_0 = np.zeros(shape) # 全0 数组 arr_1 = np.ones(shape) # 全1 数组 arr_2 = np.full(shape, 2) # 全2 数组 ``` 2. 请创建长度为16的一维数组,其中数据为 24,22,20,18...,-6. ```python arr = np.arange(24, -8, -2) arr ``` array([24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, -2, -4, -6]) 3. 请获取数组`arr1`的维度、形状与数据类型. ```python print("维度:", arr1.ndim) print("形状:", arr1.shape) print("数据类型:", arr1.dtype) ``` 维度: 5 形状: (1, 2, 3, 4, 5) 数据类型: datetime64[s] 4. 请获取`arr2`的简略字符串与详细字符串表示. ```python print("简略字符串:", str(arr2)) print("详细字符串:\n", repr(arr2)) ``` 简略字符串: [[1. 2. 3.] [4. 5. 6.]] 详细字符串: array([[1., 2., 3.], [4., 5., 6.]]) 5. 请计算将`arr2`中的每个元素加100的平方根后的数组, 并求出它的最大值、均值与标准差. ```python arr = np.sqrt(arr2 + 100) print("最大值:", np.max(arr)) print("均值:", np.mean(arr)) print("标准差:", np.std(arr)) arr ``` 最大值: 10.295630140987 均值: 10.173148676451225 标准差: 0.08394049570182746 array([[10.04987562, 10.09950494, 10.14889157], [10.19803903, 10.24695077, 10.29563014]]) 6. 请遍历`arr2`中的所有元素并存储到一个集合`set`中. ```python result = set() for i in arr2.flat: result.add(i) result ``` {np.float64(1.0), np.float64(2.0), np.float64(3.0), np.float64(4.0), np.float64(5.0), np.float64(6.0)} 7. 请获取一个数值为1 ~ 9 ,形状为 (3, 3)的数组,将其存储至`arr3`中. ```python arr3 = np.arange(1,10).reshape(3,3) arr3 ``` array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 8. 请计算`arr2`与`arr3`在第一个轴上的堆叠,`arr2`在`arr3`之前. ```python np.concatenate((arr2, arr3), axis=0) ``` array([[1., 2., 3.], [4., 5., 6.], [1., 2., 3.], [4., 5., 6.], [7., 8., 9.]]) ## 实战演练 这里我们使用了经典的鸢尾花数据集(Iris Dataset)。已知数组`iris_arr`存储的是`iris_df`的特征,即其中第2-5列的数据(按照顺序),数组`iris_index`存储的是这四列的名称,`iris_target`存储的是目标特征,即`species`列中的数据。请完成下述问题。 ```python iris_arr = iris_df.to_numpy()[:,1:5].astype(np.float64) iris_index = iris_df.columns[1:5].to_list().copy() iris_target = iris_df.to_numpy()[:, 5].copy() iris_df.head() ```
Unnamed: 0 sepal_length sepal_width petal_length petal_width species
0 0 5.1 3.5 1.4 0.2 Iris-setosa
1 1 4.9 3.0 1.4 0.2 Iris-setosa
2 2 4.7 3.2 1.3 0.2 Iris-setosa
3 3 4.6 3.1 1.5 0.2 Iris-setosa
4 4 5.0 3.6 1.4 0.2 Iris-setosa
1. 请计算每个特征的均值和方差 ```python means = np.mean(iris_arr, axis=0) variances = np.var(iris_arr, axis=0) for col_name, mean, variance in zip(iris_index, means, variances): print(f"特征{col_name}的均值为:", mean) print(f"特征{col_name}的方差为:", variance) ``` 特征sepal_length的均值为: 5.843333333333334 特征sepal_length的方差为: 0.6811222222222223 特征sepal_width的均值为: 3.0540000000000003 特征sepal_width的方差为: 0.18675066666666668 特征petal_length的均值为: 3.758666666666666 特征petal_length的方差为: 3.092424888888889 特征petal_width的均值为: 1.1986666666666668 特征petal_width的方差为: 0.5785315555555555 2. 请将`iris`数据标准化(均值为0,方差为1) ```python iris_arr = (iris_arr - means) / np.sqrt(variances) iris_df.iloc[:, 1:5] = iris_arr iris_df.head() ```
Unnamed: 0 sepal_length sepal_width petal_length petal_width species
0 0 -0.900681 1.032057 -1.341272 -1.312977 Iris-setosa
1 1 -1.143017 -0.124958 -1.341272 -1.312977 Iris-setosa
2 2 -1.385353 0.337848 -1.398138 -1.312977 Iris-setosa
3 3 -1.506521 0.106445 -1.284407 -1.312977 Iris-setosa
4 4 -1.021849 1.263460 -1.341272 -1.312977 Iris-setosa
3. 请计算每个类别的平均特征值 ```python unique_classes = np.unique(iris_target) class_means = {} for cls in unique_classes: class_data = iris_arr[iris_target == cls] class_means[cls] = np.mean(class_data, axis=0) print("每个类别的平均特征值:") for class_name, mean_values in class_means.items(): print(f"{class_name}: {mean_values}") ``` 每个类别的平均特征值: Iris-setosa: [-1.01457897 0.84230679 -1.30487835 -1.25512862] Iris-versicolor: [ 0.11228223 -0.65718442 0.28508673 0.16740892] Iris-virginica: [ 0.90229674 -0.18512237 1.01979162 1.08771971]